/**
 * 状态模式：
 *    允许一个对象在其内部状态改变的时候改变它的行为，对象看起来修改了它的类。
 *    其实就是用一个对象或者数组记录一组状态，每个状态对应一个实现，实现的时候根据状态 
 *    挨个去运行实现。
 * 
 *  状态模式的思路是：
 *   
 *    首先创建一个状态对象或者数组，内部保存状态变量，然后内部封装好每种动作对应的状态，
 *    然后状态对象返回一个接口对象，它可以对内部的状态修改或者调用。
 * 
 * 使用场景：
 *    1、一个对象的行为取决于它的状态，并且它【必须在运行时候根据状态改变它的行为】。
 *    2、一个操作中含有大量的分支语句，而且这些分支语句依赖于该对象的状态。这些状态通常
 *       为一个或者多个枚举常量表示。
 */

const SuperMarry = (
    function () { 
        let currentState = [],
            states = {
                jump() { console.log("跳") },
                run() { console.log("跑")}, 
                move() { console.log("移动") }, 
                shoot() { console.log("射击")}, 
                squat() { console.log("蹲下")}, 
            }
            
        const Action = {
            changeState(states) { 
                currentState = states
                return this
            },
            action() { 
                currentState.forEach(T => states[T] && states[T]()) 
                return this
            }
        }

        return {
            change: Action.changeState,
            go:Action.action
        }
    }
)()

console.log(SuperMarry) // { change: [Function: changeState], go: [Function: action] }
console.log(SuperMarry.change(["run","jump"]))
console.log(SuperMarry.change(["run","jump"]).go())


/**
 * 需求：
 *      总共有  "FULL" "HALF" "LITLE" "NONE" 四种状态
 *      FULL:  全员到岗
 *      HALF:  加班
 *      LITLE: 
 *      NONE: 
 */
